1、中断简介
	中断指 CPU 接收到某些事件，暂停正在执行的程序，转而去执行处理该事件的程序，当这段程序执行完毕后再继续执
行之前的程序，整个过程称为中断处理，简称中断，而引起这一过程的事件称为中断事件。
2、 irq_desc 对象
	irq_desc 对象用于描述中断源，系统中每一个中断源都用一个 irq_desc 对象来描述，其核心成员如下：
	//中断数据，主要包含有些访问硬件的函数
	struct irq_data irq_data;
	//中断处理函数，没有特殊需求的情况下一般设置为 handle_level_irq 函数，它主要去处理 action 中的各种事务
	irq_flow_handler_t handle_irq;
	//包含一些列的中断事务，一般由用户调用 request_irq 类型的函数进行设置
	struct irqaction *action;
3、 irq_data 对象
	irq_data 对象包含中断的一些数据，其中主要包括操作中断控制器的函数集合，其核心成员如下：
	//逻辑中断号
	unsigned int irq;
	//物理中断号
	unsigned long hwirq;
	//指向访问底层硬件的函数集合，由中断控制器驱动绑定
	struct irq_chip *chip;
	//指向所属的中断域，在内核分配 irq_desc 时绑定
	struct irq_domain *domain;
4、 irq_chip 对象
	irq_chip 对象主要包含操作中断控制器的函数，其核心成员如下：
	//响应中断，表示开始处理中断
	void (*irq_ack)(struct irq_data *data);
	//屏蔽指定中断
	void (*irq_mask)(struct irq_data *data);
	//屏蔽并相应某个中断
	void (*irq_mask_ack)(struct irq_data *data);
	//取消对某个中断的屏蔽
	void (*irq_unmask)(struct irq_data *data);
	//中断处理结束
	void (*irq_eoi)(struct irq_data *data);
5、 irq_domain 对象
	irq_domain 对象用于描述一个中断控制域，它包含物理中断信息、映射信息、中断映射操作函数，其核心成员如下：
	//中断控制器名称
	const char *name;
	//中断域操作函数集合
	const struct irq_domain_ops *ops; 
	//此中断控制器的设备树节点
	struct device_node *of_node;
	//支持中断数量的最大值
	irq_hw_number_t hwirq_max;
	//线性映射的大小
	unsigned int revmap_size;
	//Radix Tree 映射使用到的 radix tree 跟节点
	struct radix_tree_root revmap_tree;
	//线性映射使用的映射表
	unsigned int linear_revmap[];
6、 irq_domain_ops 对象
	irq_domain_ops 对象用于为中断控制域提供映射相关操作的函数集合，其核心成员如下：
	/* 主要是 legacy 方式使用 */
	//设置 irq_desc
	int (*map)(struct irq_domain *d, unsigned int virq, irq_hw_number_t hw);
	//执行与 map 相反的操作
	void (*unmap)(struct irq_domain *d, unsigned int virq);
	//解析设备树
	int (*xlate)(struct irq_domain *d, struct device_node *node,
		const u32 *intspec, unsigned int intsize,
		unsigned long *out_hwirq, unsigned int *out_type);
	/* 主要是 linear 和 hierarchy 方式使用 */
	//设置 irq_desc
	int (*alloc)(struct irq_domain *d, unsigned int virq,
		unsigned int nr_irqs, void *arg);
	//执行与 alloc 相反的操作
	void (*free)(struct irq_domain *d, unsigned int virq, 
		unsigned int nr_irqs);
	//解析设备树
	int (*translate)(struct irq_domain *d, struct irq_fwspec *fwspec, 
		unsigned long *out_hwirq, unsigned int *out_type);
7、中断层次结构
	在 Linux 中可能由多个中断控制器，它们采用上下级的方式构成一个多层次的数据结构，其中上级与下级对应的关系主
要有一对多和一对一两种：
	一对多中断控制器（linear或legacy）：上一级中断控制器中的一个中断号对应下一级中断控制器中的多个中断号，在
这种情况下所有中断号都会占用一个 irq_desc 。假设下级中断控制器的 B 号中断触发了上级中断控制器的 A 号中断，其
中断处理流程如下：
	//具体处理流程依程序而定，如边沿触发则无需屏蔽
	执行 irq_desc A 的 handle_irq 函数
		使用 irq_desc A 中的 irq_data 屏蔽并响应 A 号中断
		读取下级中断控制器，确定是那号中断触发了上一级中断控制器的 A 号中断（这里假设是 B 号中断触发的）
		使用 irq_desc B 中的 irq_data 屏蔽并响应 B 号中断
		执行 irq_desc B 的 handle_irq 函数
			执行 irq_desc B 的 action 链表中的中断事件处理函数
		使用 irq_desc B 中的 irq_data 清除并开启 B 号中断
		使用 irq_desc A 中的 irq_data 清除并开启 A 号中断
	一对一中断控制器（hierarchy）：上一级中断控制器中的多个中断与下一级中断控制器中的多个中断一一对应，这种
情况下上一级中断控制器的中断与对应的下一级中断控制器的中断共用一个 irq_desc 。假设下级中断控制器的 B 号中断
触发了上级中断控制器的 A 号中断，其中断处理流程如下：
	//具体处理流程依程序而定，如边沿触发则无需屏蔽
	执行 irq_desc 的 handle_irq 函数
		使用 irq_desc 中的 irq_data B 屏蔽并响应 B 号中断
		使用 irq_desc 中的 irq_data A 屏蔽并响应 A 号中断（irq_desc 中有一个 irq_data 链表）
		执行 irq_desc 的 action 链表中的中断事件处理函数
		使用 irq_desc 中的 irq_data A 清除并开启 A 号中断
		使用 irq_desc 中的 irq_data B 清除并开启 B 号中断
